package com.example.mysql.学习笔记.基础.各种数据类型.文本字符串;

public class char和varchar {
}
/**
 * CHAR(M) 和 VARCHAR(M)
 * | 字符串(文本)类型 | 特点            | 长度 | 长度范围        | 占用的存储空间        |
 * | ---------------- | --------    | ---- | --------------- | --------------------- |
 * | CHAR(M)          | 固定长度      | M    | 0 <= M <= 255   | M个字节               |
 * | VARCHAR(M)       | 可变长度       | M    | 0 <= M <= 65535(其实最大其实是21845) | (实际长度 + 1) 个字节 | +1表示那个字节表示字符占用了多少字符
 *
 * char
 * | 类型       | 特点      | 空间上         | 时间上   | 适用场景             |
 * | ---------- | -------- | ------------ | ------ | -------------------- |
 * | CHAR(M)    | 固定长度  | 浪费存储空间     | 效率高  | 存储不大，速度要求高 |    默认长度1
 * | VARCHAR(M) | 可变长度  | 节省存储空间     | 效率低   | 非CHAR的情况         |
 *
 * VARCHAR  超过字符会报错
 *  5.7    存储的时候 会自动补空格  但是返回的时候  他自动把空格过滤了  包括自己添加的空格
 *
 *  VARCHAR(M)  必须写M  0 <= M <= 65535(其实最大其实是16845)   因为 汉字最多3字节
 *  情况1：存储很短的信息。比如门牌号码101，201……这样很短的信息应该用char，
 *         因为varchar还要占个byte用于存储信息长度，本来打算节约存储的，结果得不偿失。
 * 情况2：固定长度的。比如使用uuid作为主键，那用char应该更合适。
 *      因为他固定长度，varchar动态根据长度的特性就消失了，而且还要占个长度信息。
 * 情况3：十分频繁改变的column。因为varchar每次存储都要有额外的计算，得到长度等工作，
 *      如果一个非常频繁改变的，那就要有很多的精力用于计算，而这些对于char来说是不需要的。
 */
